//
//  Folder.m
//  My Dream Slapper
//
//  Created by Jason Harris on 8/26/06.
//  Copyright (c) 2006, Jason Harris and Geekspiff
//  All rights reserved.
//  
//  Redistribution and use in source and binary forms, with or without modification, are permitted provided
//  that the following conditions are met:
//  
//  Redistributions of source code must retain the above copyright notice, this list of conditions and the
//  following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list
//  of conditions and the following disclaimer in the documentation and/or other materials provided with the
//  distribution. Neither the name of Jason Harris, Geekspiff, nor the names of its contributors may be used
//  to endorse or promote products derived from this software without specific prior written permission.
//  
//  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
//  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
//  PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
//  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
//  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
//  HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
//  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
//  POSSIBILITY OF SUCH DAMAGE.
//

#import "Folder.h"
#import "SharedFolder.h"


@implementation Folder

- (void)_setDefaultName
{
	int i = 0;
	NSString *name = [self defaultName];
	NSError *error;
	NSManagedObjectContext *moc = [self managedObjectContext];
	NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease];
	NSEntityDescription *entity = [NSEntityDescription entityForName: @"Folder" inManagedObjectContext: moc];
	[fetchRequest setEntity: entity];
	
	while (YES)
	{
		NSMutableString *thisName = [[name mutableCopy] autorelease];
		if ( 0 != i )
			[thisName appendFormat: @" %d", i];
		++i;
		
		NSPredicate *predicate = [NSPredicate predicateWithFormat: @"name == %@", thisName];
		[fetchRequest setPredicate: predicate];
		NSArray *foundEntries = [moc executeFetchRequest: fetchRequest error: &error];
		if ( !foundEntries && error )
			[NSException raise: NSGenericException format: @"%@", error];
		unsigned int count = [foundEntries count];
		if ( count == 0 )
		{
			[self setValue: thisName forKey: @"name"];
			return;
		}
	}
}


- (void)awakeFromInsert
{
	[super awakeFromInsert];
	[self _setDefaultName];
}


- (void)didTurnIntoFault
{
	[super didTurnIntoFault];
	[_predicate release];
	_predicate = nil;
	[_icon release];
	_icon = nil;
}


- (NSString *)defaultName
{  return NSLocalizedString(@"DefaultFolderName", nil);  }


- (void)setFirstSortKeyForBase: (int)base
{
	int i = 0;
	NSError *error;
	NSManagedObjectContext *moc = [self managedObjectContext];
	NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease];
	NSEntityDescription *entity = [NSEntityDescription entityForName: @"Folder" inManagedObjectContext: moc];
	[fetchRequest setEntity: entity];
	
	while (YES)
	{
		NSNumber *thisNumber = [NSNumber numberWithUnsignedInt: base+i++];
		NSPredicate *predicate = [NSPredicate predicateWithFormat: @"sortKey == %@", thisNumber];
		[fetchRequest setPredicate: predicate];
		NSArray *foundEntries = [moc executeFetchRequest: fetchRequest error: &error];
		if ( !foundEntries && error )
			[NSException raise: NSGenericException format: @"%@", error];
		unsigned int count = [foundEntries count];
		if ( count == 0 )
		{
			[self setValue: thisNumber forKey: @"sortKey"];
			return;
		}
	}
}


- (NSImage *)icon
{
	[self willAccessValueForKey: @"icon"];
	if ( ! _icon )
	{
		NSString *path = nil;
		if ( [self isKindOfClass: [SharedFolder class]] )
			path = @"/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/GenericNetworkIcon.icns";
		else if ([self valueForKey: @"predicateString"])
			path = @"/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/SmartFolderIcon.icns";
		else
			path = @"/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/GenericFolderIcon.icns";
		
		_icon = [[NSImage alloc] initWithContentsOfFile: path];
		NSParameterAssert( _icon != nil );
	}
	[self didAccessValueForKey: @"icon"];
	return _icon;
}


- (void)setPredicateString: (NSString *)predicateString
{
	[self willChangeValueForKey: @"predicateString"];
	[self setPrimitiveValue: predicateString forKey: @"predicateString"];
	[self didChangeValueForKey: @"predicateString"];
	
	[self willChangeValueForKey: @"predicate"];
	[_predicate release];
	_predicate = [[NSPredicate predicateWithFormat: predicateString] retain];
	[self didChangeValueForKey: @"predicate"];
}


- (NSPredicate *)predicate
{
	[self willAccessValueForKey: @"predicate"];
	if ( ! _predicate )
	{
		NSString *predicateString = [self valueForKey: @"predicateString"];
		if ( predicateString )
			_predicate = [[NSPredicate predicateWithFormat: predicateString] retain];
	}
	[self didAccessValueForKey: @"predicate"];
	return _predicate;
}

@end
